import pickle, base64

from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, user, response):
    """登录时购物车合并"""

    #获取cookie中的购物车数据
    cookie_cart = request.COOKIES.get('cart')

    cart_dict = pickle.loads(base64.b64decode(cookie_cart.encode()))

    if not len(cart_dict.keys()): #如果cookie购物车没有数据,就不要执行下面的逻辑

        return response


    #获取redis中的数据
    redis_conn = get_redis_connection('cart')

    redis_cart_dict = redis_conn.hgetall('cart_%s' %user.id)

    redis_selected = redis_conn.smembers('cart_selected_%s' %user.id)

    """
    cookie_dict{

    sku_1 : {
    'count': count,
    'selected': True
    },

    sku_2:{
     'count': count,
    'selected': True
    },
    """


    new_redis_cart_dict = {}  # 将来要重新存到redis中的购物车数据
    # 把redis中的数据加到new_redis_cart_dict中,目的是如果cookie中有相同的商品,可以用cookie的数据覆盖redis的数据


    for sku_id, count in redis_cart_dict.items():#注意类型问题,redis取出的值为byte类型

        new_redis_cart_dict[int(sku_id)] = int(count)

    for sku_id, count_selected in cart_dict.items(): #将cookie字典数据想redis 哈系中字典靠拢

        new_redis_cart_dict[sku_id] = count_selected['count']

        # cookie购物车商品勾选状态
        if count_selected['selected']:

            #redis set类型取出后返回的是set集合
            redis_selected.add(sku_id)

    #创建管道
    pl = redis_conn.pipeline()

    pl.hmset('cart_%s' %user.id, new_redis_cart_dict)

    pl.sadd('cart_selected_%s' %user.id, *redis_selected)

    pl.execute()

    #合并后删除cookie购物车数据
    response.delete_cookie('cart')

    return response